/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is Forte for Java, Community Edition. The Initial * Developer of the Original Code is Sun Microsystems, Inc. Portions * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved. */ package org.netbeans.core; import java.awt.*; import java.awt.event.*; import java.beans.*; import javax.swing.*; import javax.swing.border.*; import org.openide.awt.*; import org.netbeans.core.awt.*; import org.openide.*; import org.openide.loaders.*; import org.openide.windows.*; import org.openide.explorer.*; import org.openide.explorer.view.BeanTreeView; import org.openide.nodes.*; /** File Selector * * @author Ales Novak, Jaroslav Tulach, Ian Formanek, Petr Hamernik, Jan Jancura * @version 0.13, Jun 07, 1998 */ class FileSelector extends CoronaDialog implements PropertyChangeListener { /** generated Serialized Version UID */ static final long serialVersionUID = 6524404012203099065L; /** manages tree */ private ExplorerManager manager; /** tree */ private BeanTreeView tree; /** base panel */ private JPanel base; /** selected nodes */ private Node[] nodes; /** flag for cancel */ boolean cancelFlag; /** instead of enable button */ private boolean accepted; /** The OK Button */ private ButtonBarButton okButton; /** The Cancel Button */ private ButtonBarButton cancelButton; /** aceptor */ private NodeAcceptor acceptor; /** reference to Frame that keeps our selected nodes synchronized with nodes actions */ // static TopFrameHack hack; /** * @param title is a title of the dialog * @param root the base object to start browsing from * @param acceptor decides whether we have valid selection or not * @param top is a Component we just place on the top of the dialog * it can be null */ FileSelector (String title, String rootLabel, Node root, final NodeAcceptor acceptor, Component top) { super (null); java.util.ResourceBundle bundle = org.openide.util.NbBundle.getBundle("org.openide.Bundle"); // NOI18N this.acceptor = acceptor; ExplorerPanel ep = new ExplorerPanel (); getCustomPane ().setLayout (new BorderLayout ()); getCustomPane ().add ("Center", ep); // NOI18N manager = ep.getExplorerManager (); setDefaultCloseOperation (JDialog.DO_NOTHING_ON_CLOSE); addWindowListener (new WindowAdapter () { public void windowClosing (WindowEvent evt) { cancelFlag = true; setVisible (false); } } ); // attach cancel also to Escape key getRootPane().registerKeyboardAction( new ActionListener() { public void actionPerformed(ActionEvent evt) { buttonPressed (1); } }, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, true), JComponent.WHEN_IN_FOCUSED_WINDOW ); // attach cancel also to Escape key getRootPane().registerKeyboardAction( new ActionListener() { public void actionPerformed(ActionEvent evt) { buttonPressed (0); } }, KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true), JComponent.WHEN_IN_FOCUSED_WINDOW ); okButton = new ButtonBarButton(bundle.getString("CTL_OK")); cancelButton = new ButtonBarButton(bundle.getString("CTL_CANCEL")); getButtonBar().setButtons( new ButtonBarButton[0], new ButtonBarButton[] { okButton, cancelButton } ); setTitle (title); manager.setRootContext (root);//s[0]); // CustomPane BorderLayout layout = new BorderLayout(); layout.setHgap(7); layout.setVgap(6); ep.setLayout(layout); ep.setBorder(new EmptyBorder(6, 7, 6, 7)); // component to place at the top try { Node[] roots; if ( root instanceof DataSystem && (roots = root.getChildren ().getNodes ()).length > 0 ) { JComboBox combo = new JComboBox(roots); combo.setSelectedIndex (0); combo.setRenderer(new FileSelectRenderer()); combo.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent evt) { Node o = (Node) evt.getItem(); manager.setRootContext(o); } }); manager.setSelectedNodes (new Node[] { roots[0] }); // North - "Create In" // NOI18N JPanel comboPanel = new JPanel(); layout = new BorderLayout(); layout.setHgap(5); // space between label and drop-down list comboPanel.setLayout(layout); // support for mnemonics (defaults to first char) JLabel label = new JLabel(rootLabel.replace('&', ' ')); label.setDisplayedMnemonic(rootLabel.charAt(rootLabel.indexOf('&') + 1)); label.setLabelFor(combo); comboPanel.add(label, "West"); // NOI18N comboPanel.add(combo, "Center"); // NOI18N ep.add (comboPanel, "North"); // NOI18N } else { manager.setSelectedNodes (new Node[] { root }); JLabel label = new JLabel(rootLabel.replace('&', ' ')); ep.add (label, "North"); // NOI18N } } catch (java.beans.PropertyVetoException e) { throw new InternalError (); } // Center tree = new BeanTreeView (); tree.setPopupAllowed (false); ep.add(tree, "Center"); // NOI18N // South if (top != null) { ep.add (top, "South"); // NOI18N } cancelFlag = false; accepted = true; manager.addPropertyChangeListener (this); center(); if (top != null) top.requestFocus (); if (acceptor.acceptNodes (manager.getSelectedNodes())) { enableButton (); } else { disableButton (); } } /** Changing properties */ public void propertyChange (PropertyChangeEvent ev) { if (ev.getPropertyName().equals (ExplorerManager.PROP_SELECTED_NODES)) { if (acceptor.acceptNodes (manager.getSelectedNodes())) { enableButton (); } else { disableButton (); } } } /* * activates hack * / public void show() { hack.activated(); super.show(); } */ public Dimension getPreferredSize() { Dimension dim = super.getPreferredSize(); dim.height = 260; return dim; } /** * @return selected nodes */ public Node[] getNodes() { return nodes; } /** enables ok button */ void enableButton () { accepted = true; okButton.setEnabled(true); } /** disables ok button */ void disableButton () { accepted = false; okButton.setEnabled(false); } /** Called when user presses a button on the ButtonBar. * @param evt The ButtonBarEvent. */ protected void buttonPressed(org.netbeans.core.awt.ButtonBar.ButtonBarEvent evt) { int index = getButtonBar().getButtonIndex(evt.getButton()); buttonPressed (index); } /** Button pressed with index. */ private void buttonPressed (int index) { switch (index) { case 0 : if (accepted) nodes = manager.getSelectedNodes (); else { // do not do dispose return; } break; case 1 : cancelFlag = true; break; } dispose(); } /** Renderer used in list box of exit dialog */ private static class FileSelectRenderer extends JLabel implements ListCellRenderer { /** generated Serialized Version UID */ static final long serialVersionUID = -7071698027341621636L; protected static Border hasFocusBorder; protected static Border noFocusBorder; public FileSelectRenderer() { setOpaque(true); setBorder(noFocusBorder); hasFocusBorder = new LineBorder(UIManager.getColor("List.focusCellHighlight")); // NOI18N noFocusBorder = new EmptyBorder(1, 1, 1, 1); } public java.awt.Component getListCellRendererComponent(JList list, Object value, // value to display int index, // cell index boolean isSelected, // is the cell selected boolean cellHasFocus) // the list and the cell have the focus { if (!(value instanceof Node)) return this; Node node = (Node)value; ImageIcon icon = new ImageIcon(node.getIcon(BeanInfo.ICON_COLOR_16x16)); setIcon(icon); setText(node.getDisplayName()); if (isSelected){ super.setBackground(UIManager.getColor("List.selectionBackground")); // NOI18N super.setForeground(UIManager.getColor("List.selectionForeground")); // NOI18N } else { super.setBackground(list.getBackground()); super.setForeground(list.getForeground()); } setBorder(cellHasFocus ? hasFocusBorder : noFocusBorder); return this; } } } /* * Log * 17 Gandalf 1.16 1/13/00 Jaroslav Tulach I18N * 16 Gandalf 1.15 10/22/99 Ian Formanek NO SEMANTIC CHANGE - Sun * Microsystems Copyright in File Comment * 15 Gandalf 1.14 9/23/99 Jaroslav Tulach * 14 Gandalf 1.13 9/23/99 Jaroslav Tulach #3962 * 13 Gandalf 1.12 8/27/99 Ian Formanek Removed obsoleted * imports * 12 Gandalf 1.11 8/13/99 Jaroslav Tulach New Main Explorer * 11 Gandalf 1.10 8/9/99 Jaroslav Tulach * 10 Gandalf 1.9 8/5/99 Jaroslav Tulach Combo works only on * filesystems. * 9 Gandalf 1.8 6/8/99 Ian Formanek ---- Package Change To * org.openide ---- * 8 Gandalf 1.7 3/22/99 Jaroslav Tulach Fixed creation from * template * 7 Gandalf 1.6 3/9/99 Jaroslav Tulach ButtonBar * 6 Gandalf 1.5 3/9/99 Jaroslav Tulach * 5 Gandalf 1.4 3/9/99 Jan Jancura Bundles moved * 4 Gandalf 1.3 1/20/99 Jaroslav Tulach * 3 Gandalf 1.2 1/6/99 Ian Formanek Reflecting changes in * location of package "awt" * 2 Gandalf 1.1 1/6/99 Jaroslav Tulach ide.* extended to * ide.loaders.* * 1 Gandalf 1.0 1/5/99 Ian Formanek * $ * Beta Change History: * 0 Tuborg 0.11 --/--/98 David Peroutka graphics design, basic support for mnemonics * 0 Tuborg 0.12 --/--/98 Jan Formanek improved focus * 0 Tuborg 0.13 --/--/98 Jan Formanek bugfixed */